home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / strbrk.arc / BINSRCH.ASM next >
Assembly Source File  |  1985-11-20  |  3KB  |  83 lines

  1. ASM_SEG        SEGMENT PARA PUBLIC 
  2.           ASSUME  CS:ASM_SEG 
  3.           PUBLIC    BINSEARCH 
  4. BINSEARCH PROC FAR                  
  5. ;    THIS SUBROUTINE IS TO BE CALLED FROM BASIC OR 
  6. ;    ANOTHER HIGH-LEVEL PROGRAMMING LANGUAGE.  IT 
  7. ;    DOES A BINARY SEARCH ON A DATA TABLE, 
  8. ;    RETURNING THE DESIRED INDEX INTO THE TABLE. 
  9. ;    FORMAT: 
  10. ;         CALL BINSEARCH (itable, ntable, jkey, indx) 
  11. ;    WHERE     itable    IS A TABLE OF INTEGER VALUES 
  12. ;         ntable    IS THE NUMBER OF ITEMS IN THE TABLE 
  13. ;         jkey IS AN INTEGER WHOSE LOCATION IN THE TABLE 
  14. ;         IS DESIRED indx IS THE RESULT.  
  15. ;         jkey = itable(indx) 
  16. ;    NOTES: 
  17. ;         ITABLE MUST BE IN ASCENDING ORDER. 
  18. ;         JKEY MUST BE A VALID KEY, I.E., IT MUST BE 
  19. ;         CONTAINED IN ITABLE. 
  20. ;    SEE APPENDIX C. OF THE BASIC MANUAL FOR DISCUSSION 
  21. ;    OF THE BASIC CALLING SEQUENCE. 
  22.           PUSH BP             ;YES, THIS IS NECESSARY! 
  23.           MOV  BP, SP 
  24.           MOV  SI, [BP]+12    ;ADDRESS OF ITABLE 
  25.           MOV  DI, [BP]+10    ;ADDRESS OF NTABLE 
  26.           MOV  DX, [DI]       ;NTABLE IN DX 
  27.           MOV  DI, [BP]+8     ;ADDRESS OF JKEY 
  28.           MOV  AX, [DI]       ;JKEY IN AX 
  29.           MOV  DI, [BP]+6     ;ADDRESS OF INDX 
  30.           MOV  BP, SI         ;MOVE ADDRESS OF ITABLE TO BP 
  31. ;    INITIALIZE ILOW, IHIGH 
  32.           MOV  CX, 1               ;CX=ILOW=1 
  33. ;                              DX=IHIGH=NTABLE 
  34. SEARCH_LOOP: 
  35.           MOV  SI, DX         ;IHIGH INTO SI 
  36.           ADD  SI, CX         ;IHIGH+ILOW IN SI 
  37.           SHR  SI, 1          ;DIVIDE BY 2 (TRUNCATE): IMID 
  38.           PUSH SI             ;SAVE IMID, CALC. OFFSET NEXT 
  39.           DEC  SI             ;ITABLE(1) IS OFFSET 0 
  40.           SHL  SI, 1          ;TWO BYTES PER ENTRY 
  41.           CMP  [BP][SI], AX   ;COMP. ITABLE(IMID) WITH JKEY 
  42.           POP  SI             ;RECOVER IMID 
  43.           JE   CLEAN_UP       ;JKEY = ITABLE(IMID), FOUND IT 
  44.           JG   JKEY_SMALLER   ;JKEY < ITABLE(IMID) 
  45.           MOV  CX, SI         ;JKEY > ITABLE(IMID), NEW ILOW 
  46.           INC  CX             ;ILOW = IMID + 1 
  47.           JMP  SEARCH_LOOP 
  48. JKEY_SMALLER: 
  49.           MOV  DX, SI         ;NEW IHIGH 
  50.           DEC  DX             ;IHIGH = IMID - 1 
  51.           JMP  SEARCH_LOOP 
  52. ;    END SEARCH_LOOP 
  53. CLEAN_UP: 
  54.           MOV  [DI], SI       ;STORE INDX 
  55.           POP  BP             ;RESTORE BP 
  56.           RET  8              ;4 ARGUMENTS 
  57. BINSEARCH ENDP 
  58. ASM_SEG        ENDS 
  59.           END 
  60.